home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Collection of Tools & Utilities
/
Collection of Tools and Utilities.iso
/
basic
/
qbnws104.zip
/
IQUEUE.ZIP
/
LSTACK.ASM
< prev
next >
Wrap
Assembly Source File
|
1990-05-14
|
4KB
|
101 lines
page ,132
title LSTACK - Add a long-integer "stack" to BC/QB
subttl Copyright 1990, Editing Services Co.
comment |
Implements a long-integer LIFO stack by adding five procedures to QB/BC:
two SUBs and three FUNCTIONs. See LQUEUE for a FIFO stack.
DECLARE SUB LSpush (ival%) 'put an item on the stack
DECLARE FUNCTION LSpop% () 'get an item off the stack
DECLARE FUNCTION LSfree% () 'TRUE if any room on stack
DECLARE FUNCTION LSavail% () 'TRUE if anything on stack
DECLARE SUB LSclear () 'clear the stack
|
page +
.model medium, basic
.data
LSP dw 0 ; DGROUP storage for stack pointer
.code
MaxLSP equ 255 ; determines max items in stack
LStack dw (2 * (MaxLSP + 1)) dup (-1)
page +
Iperr:: INT 4 ; report an "Overflow" to QB/BC
LSpush PROC lval
; Accepts a long-integer value and places it onto our stack.
; Generates an Overflow Error in QB if there is no room on the stack.
mov bx, lval ; get pointer to passed value
mov ax, [bx] ; hold actual value
mov dx, 2[bx] ; high part too
mov bx, LSP ; get the current stack pointer
inc bx ; increment it first
cmp bx, MaxLSP ; test against the allowed maximum depth
ja Iperr ; if stack already full, Overflow Error
mov LSP, bx ; otherwise, save new SP
shl bx, 1 ; turn SP into a word pointer
shl bx, 1 ; then into a dword pointer
mov LStack[bx], ax ; stack the low part of the item
add bx, 2
mov LStack[bx], dx ; then the high part
ret
LSpush ENDP
LSpop PROC
; Returns the most recently pushed value from our stack.
; Generates an Overflow Error if there are no values on the stack.
mov bx, LSP ; get current stack pointer
or bx, bx ; is it zero?
jz Iperr ; yes, stack is empty: Overflow error
shl bx, 1 ; turn LSP into a word pointer
shl bx, 1 ; and then a dword pointer
mov ax, LStack[bx] ; retrieve low half of value from stack
add bx, 2
mov dx, LStack[bx] ; retrieve high part of value, too
dec LSP ; decrement saved LSP
ret ; and return value in DX:AX
LSpop ENDP
LSclear PROC
; "Clear" the stack by resetting our stack pointer to zero.
mov LSP, 0
ret
LSclear ENDP
LSfree PROC
; Returns TRUE if there is any space left in the stack.
xor ax, ax ; assume there's no room
cmp LSP, MaxLSP ; set carry if room left
sbb ax, ax ; adjust result to -1 if room
ret
LSfree ENDP
LSavail PROC
; Returns TRUE if there are any data items on the stack
xor ax, ax ; assume no items present
cmp ax, LSP ; set carry if LSP non-zero
sbb ax, ax ; adjust result to TRUE if stack used
ret
LSavail ENDP
page +
end